{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import glob\n",
    "import os\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Process the pdb file and summarize overall results to csv file"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_10800/1838829422.py:19: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n",
      "  plddt_df = plddt_df.groupby('length', group_keys=False).apply(lambda x: x.sort_values('seq_idx'))\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>seq_idx</th>\n",
       "      <th>length</th>\n",
       "      <th>plddt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>100</td>\n",
       "      <td>73.436035</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>1</td>\n",
       "      <td>100</td>\n",
       "      <td>85.358810</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>2</td>\n",
       "      <td>100</td>\n",
       "      <td>47.136200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>3</td>\n",
       "      <td>100</td>\n",
       "      <td>43.678627</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>4</td>\n",
       "      <td>100</td>\n",
       "      <td>74.624428</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>188</th>\n",
       "      <td>35</td>\n",
       "      <td>500</td>\n",
       "      <td>94.508049</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>189</th>\n",
       "      <td>36</td>\n",
       "      <td>500</td>\n",
       "      <td>91.406937</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>190</th>\n",
       "      <td>37</td>\n",
       "      <td>500</td>\n",
       "      <td>82.436523</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>191</th>\n",
       "      <td>38</td>\n",
       "      <td>500</td>\n",
       "      <td>87.450317</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>192</th>\n",
       "      <td>39</td>\n",
       "      <td>500</td>\n",
       "      <td>94.210419</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>200 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     seq_idx  length      plddt\n",
       "0          0     100  73.436035\n",
       "11         1     100  85.358810\n",
       "22         2     100  47.136200\n",
       "33         3     100  43.678627\n",
       "34         4     100  74.624428\n",
       "..       ...     ...        ...\n",
       "188       35     500  94.508049\n",
       "189       36     500  91.406937\n",
       "190       37     500  82.436523\n",
       "191       38     500  87.450317\n",
       "192       39     500  94.210419\n",
       "\n",
       "[200 rows x 3 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "output_dir = \"generation-results/dplm_650m\"\n",
    "\n",
    "plddt_dict = {\"seq_idx\": [], \"length\": [], \"plddt\": []}\n",
    "\n",
    "for pdb_foldername in os.listdir(os.path.join(output_dir, \"esmfold_pdb\")):\n",
    "    length = pdb_foldername.split(\"_\")[3]\n",
    "    for pdb_filename in os.listdir(\n",
    "        os.path.join(output_dir, f\"esmfold_pdb/{pdb_foldername}\")\n",
    "    ):\n",
    "        seq_idx = pdb_filename.split(\"_\")[1]\n",
    "        plddt = pdb_filename.split(\"_\")[-1][:-4]\n",
    "        plddt_dict[\"seq_idx\"].append(int(seq_idx))\n",
    "        plddt_dict[\"length\"].append(int(length))\n",
    "        plddt_dict[\"plddt\"].append(float(plddt))\n",
    "\n",
    "plddt_df = pd.DataFrame(plddt_dict).sort_values(\"length\")\n",
    "plddt_df = plddt_df.groupby(\"length\", group_keys=False).apply(\n",
    "    lambda x: x.sort_values(\"seq_idx\")\n",
    ")\n",
    "plddt_df.to_csv(os.path.join(output_dir, \"result.csv\"))\n",
    "plddt_df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Lineplot according to the sequence length"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>length</th>\n",
       "      <th>plddt</th>\n",
       "      <th>model</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>70.241217</td>\n",
       "      <td>dplm_650m</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200</td>\n",
       "      <td>83.125927</td>\n",
       "      <td>dplm_650m</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>300</td>\n",
       "      <td>85.899873</td>\n",
       "      <td>dplm_650m</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>400</td>\n",
       "      <td>84.032781</td>\n",
       "      <td>dplm_650m</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>500</td>\n",
       "      <td>83.599222</td>\n",
       "      <td>dplm_650m</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   length      plddt      model\n",
       "0     100  70.241217  dplm_650m\n",
       "1     200  83.125927  dplm_650m\n",
       "2     300  85.899873  dplm_650m\n",
       "3     400  84.032781  dplm_650m\n",
       "4     500  83.599222  dplm_650m"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "output_dir_list = [\"generation-results/dplm_650m/result.csv\"]\n",
    "model_name_list = [\"dplm_650m\"]\n",
    "plddt_df_list = []\n",
    "for i, output_dir in enumerate(output_dir_list):\n",
    "    plddt_df = pd.read_csv(output_dir)\n",
    "    plddt_df = plddt_df.groupby(\"length\", as_index=False)[\"plddt\"].mean()\n",
    "    plddt_df[\"model\"] = model_name_list[i]\n",
    "    plddt_df_list.append(plddt_df)\n",
    "plddt_df = pd.concat(plddt_df_list, ignore_index=True)\n",
    "plddt_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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GtG//vUvbrjhBs4991ycTieGYTB79uxajy8pKWHixIl07doVp9NJt27duPPOOykrK6vx+HA4zOOPP06fPn1ISkoiOzuba6+9lm3btjVRi46vPm2eMmUKhmHU+rVjx44az5s3bx5Dhw4lNTWVtLQ0hg0bxsKFC5uuUXXw7bff8uijjzJq1ChOOukkHA4H7du356qrruKjjz6q8ZxEuN/1bXei3HOv18vEiRMZMmQIHTt2xOVy0b59e3Jzc5k1axaBQKDaOYlwv+vb7kS537X585//HG3L6tWrq+1PhHtek2O1O1Huebdu3WptQ15eXrXjfT4fDz74ID179sTlctGxY0d+/etfc+DAgVqv8e9//5sBAwaQnJxMRkYGl112GWvWrGn0tmiC4kZ07733snPnTrKysujQoQM7d+6s9djy8nKGDh3KunXrGDVqFNdeey1r167lr3/9K0uXLmXZsmW4XK4q59xwww3MnDmTM888k1tvvZW9e/fy6quvMn/+fFavXk3Pnj2buonV1KfNlcaOHUu3bt2qbU9PT6+27V//+he//OUvyc7OZty4cQC88sorjBw5kldffZWrr776BFvQMI8//jh//vOfOfnkkxk1ahTZ2dls3bqVOXPmMGfOHF588UV++tOfRo9PlPtd33ZXivd7XlZWxpNPPsmAAQP44Q9/SHZ2NkVFRcydO5frrruOl19+mblz50ZnhE+U+13fdleK9/tdkw0bNjB58mSSk5MpLy+vtj9R7vnRjtfuSolwz91uN7/73e+qbT+6XeFwmMsvv5x58+ZxwQUXcNVVV7F161ZmzpzJwoULWb16NdnZ2VXO+dOf/sS9995L165d+d///V9KS0t5+eWXGTRoEAsXLiQ3N7fxGmJKo/nggw/MHTt2mKZpmtOmTTMBc9asWTUee//995uAedddd1XZftddd5mAOXXq1CrbFy1aZALmkCFDTJ/PF93+3nvvmYA5atSoxm1MHdWnzZMnTzYBc/HixXX67EOHDpnp6elmVlaWuXv37uj23bt3m1lZWWZWVpZZUlJyok1okNdff91csmRJte3Lli0z7Xa7mZGRYXq93uj2RLnf9W13otzzUChU5T5UCgQCZl5engmY7777bnR7otzv+rY7Ue730fx+v3n22Web559/vjlmzBgTMFetWlXlmES5599Xl3Ynyj3v2rWr2bVr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mv36Z599NgBLly6t9ZgVK1bU+n6dxfLdX9tmLRMoi0jrpWAnIq3Or3/9awDee+893nvvvWMee/TghxN19dVXA7Bjxw5efPHFavtN0zzmgI60tLTo/xcXFzdqbSIS/xTsRCShFBQUHPOruLiYMWPG8IMf/ADTNLnyyiv54x//WOXRaHl5OYsXL+bmm2+mR48ejVrfhRdeyMiRIwG4/vrrmT17dnQwx549e/jFL37B8uXLax2hmp6eTqdOnQCYNWtWo4ycFZHEoWAnIgklOzv7mF95eXlYrVZef/11LrvsMvx+P/fddx+dOnXC7XaTkZFBamoqw4cP5+9//zvl5eWNXuPzzz9Pr169OHz4MOPHjyc1NZWMjAy6dOnCK6+8whNPPEFWVhYALper2vn/+7//C8Djjz9OSkoKJ510Et26deNnP/tZo9cqIvFFwU5EWqW0tDTeeecd3nvvPX76059y0kkn4fP5OHz4MJ06dWLUqFFMmzaNLVu2NPq127dvzyeffMJ9993HaaedhsViwWazcemll7Jo0SKuv/766FJk6enp1c6/5557eOyxxzj33HOx2+3s2bOHnTt3Nsr0KCIS3wxTb9+KiLQoW7du5dRTTwVg165ddOnSJcYViUi8UI+diEgLM23aNADOOOMMhToRqRcFOxGRZrZ582YmTJjAsmXLKC0trbJ9/PjxzJo1C4C77747ViWKSJzSo1gRkWa2bt06+vfvH/212+0mEAhUWbrs1ltv5bHHHotFeSISxxTsRESaWWlpKc888wwLFixgy5YtHDhwgGAwSLt27Rg4cCC//vWvGTFiRKzLFJE4pGAnIiIikiD0jp2IiIhIglCwExEREUkQCnYiIiIiCULBTkRERCRBKNiJiIiIJAgFOxEREZEEoWAnIiIikiAU7EREREQShIKdiIiISIL4/w371d7CYVcwAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Create scatter plot\n",
    "palette_candidate = [\"#EECF73\", \"#5FB1A5\", \"#F9633D\"]\n",
    "palette = [palette_candidate[i] for i in range(len(model_name_list))]\n",
    "markers_candidate = [\"o\", \"v\", \"s\"]\n",
    "markers = [markers_candidate[i] for i in range(len(model_name_list))]\n",
    "# palette = ['#8dd3c7', '#80b1d3', '#bebada']\n",
    "sns.lineplot(\n",
    "    data=plddt_df,\n",
    "    x=\"length\",\n",
    "    y=\"plddt\",\n",
    "    hue=\"model\",\n",
    "    style=\"model\",\n",
    "    markers=markers,\n",
    "    markersize=10,\n",
    "    dashes=False,\n",
    "    palette=palette,\n",
    ")\n",
    "\n",
    "# Adding labels and title\n",
    "plt.xlabel(\"Length\", fontdict={\"size\": 18})\n",
    "plt.ylabel(\"pLDDT\", fontdict={\"size\": 18})\n",
    "plt.xticks(size=14)\n",
    "plt.yticks(size=14)\n",
    "plt.tight_layout()\n",
    "plt.legend(title=None, prop={\"size\": 15})\n",
    "\n",
    "# Show plot\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Diversity Analysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_length = []\n",
    "\n",
    "\n",
    "def load_tmscore(eval_dir):\n",
    "    dfs = []\n",
    "    for path in glob.glob(eval_dir + \"/**/inter_tmscore.csv\"):\n",
    "        print(path)\n",
    "        df = pd.read_csv(path)\n",
    "        length = path.split(\"/\")[-2].split(\"_\")[-1]\n",
    "        df[\"length\"] = [length] * len(df)\n",
    "        dfs.append(df)\n",
    "    df_cat = pd.concat(dfs)\n",
    "    df_cat = df_cat.sort_values(\"length\")\n",
    "    return df_cat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "../generation-results/dplm_650m/diversity/iter_500_L_100/inter_tmscore.csv\n",
      "../generation-results/dplm_650m/diversity/iter_500_L_200/inter_tmscore.csv\n",
      "../generation-results/dplm_650m/diversity/iter_500_L_300/inter_tmscore.csv\n",
      "../generation-results/dplm_650m/diversity/iter_500_L_400/inter_tmscore.csv\n",
      "../generation-results/dplm_650m/diversity/iter_500_L_500/inter_tmscore.csv\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_13209/836779224.py:6: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n",
      "  df = df_cat.groupby('length').apply(lambda x: x['tm_scores_mean'].mean())\n",
      "/tmp/ipykernel_13209/836779224.py:10: FutureWarning: \n",
      "\n",
      "Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.\n",
      "\n",
      "  sns.barplot(x='length', y='inner-TM', data=df, palette=\"Spectral\", edgecolor=\"black\")\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "dir_path = \"../generation-results/dplm_650m/diversity\"\n",
    "df_cat = load_tmscore(dir_path)\n",
    "df_cat[\"tm_scores\"] = df_cat[\"tm_scores\"].apply(lambda x: eval(x))\n",
    "df_cat[\"tm_scores_mean\"] = df_cat[\"tm_scores\"].apply(lambda x: sum(x) / len(x))\n",
    "\n",
    "df = df_cat.groupby(\"length\").apply(lambda x: x[\"tm_scores_mean\"].mean())\n",
    "df = df.reset_index()\n",
    "df.columns = [\"length\", \"inner-TM\"]\n",
    "# plt.figure(figsize=(10, 6))\n",
    "sns.barplot(\n",
    "    x=\"length\", y=\"inner-TM\", data=df, palette=\"Spectral\", edgecolor=\"black\"\n",
    ")\n",
    "plt.xlabel(\"Length\", fontdict={\"size\": 18})\n",
    "plt.ylabel(\"inner-TM\", fontdict={\"size\": 18})\n",
    "plt.xticks(size=14)\n",
    "plt.yticks(size=14)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Novelty Analysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_length = []\n",
    "\n",
    "\n",
    "def load_tmscore(eval_dir):\n",
    "    dfs = []\n",
    "    for path in glob.glob(eval_dir + \"/**/inter_tmscore.csv\"):\n",
    "        print(path)\n",
    "        df = pd.read_csv(path)\n",
    "        length = path.split(\"/\")[-2].split(\"_\")[-1]\n",
    "        df[\"length\"] = [length] * len(df)\n",
    "        dfs.append(df)\n",
    "    df_cat = pd.concat(dfs)\n",
    "    df_cat = df_cat.sort_values(\"length\")\n",
    "    return df_cat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "../generation-results/dplm_650m/novelty/iter_500_L_100/inter_tmscore.csv\n",
      "../generation-results/dplm_650m/novelty/iter_500_L_200/inter_tmscore.csv\n",
      "../generation-results/dplm_650m/novelty/iter_500_L_300/inter_tmscore.csv\n",
      "../generation-results/dplm_650m/novelty/iter_500_L_400/inter_tmscore.csv\n",
      "../generation-results/dplm_650m/novelty/iter_500_L_500/inter_tmscore.csv\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_13209/297249591.py:6: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n",
      "  df = df_cat.groupby('length').apply(lambda x: x['tm_scores_max'].mean())\n",
      "/tmp/ipykernel_13209/297249591.py:10: FutureWarning: \n",
      "\n",
      "Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.\n",
      "\n",
      "  sns.barplot(x='length', y='pdb-TM', data=df, palette=\"Spectral\", edgecolor=\"black\")\n"
     ]
    },
    {
     "data": {
      "image/png": "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kszOGjkcDnXt2rXOPtLT05WRkaFXXnlFISEhTarDarXKarU2aVsAAOB5PCIoVc1Nys3N1Y033lhtXWFhoYqLixUREVFnH++//74k6c4776x1fWZmpiwWi0aOHKkjR440v2gAAJooPz9fRUVFbV2GRwoJCVH//v1brD+PCErjxo1TSkqKsrKyNHPmzGrrMjMzXW3qMmbMGBUXF9dYXlxcrG3btqlv376KiYlp0Q8XAIDGys/P15AhQ3T58uW2LsUjde7cWceOHWux3+ceEZQmTZqk8PBwbd26VQ899JDrXkp2u13Jycny9fXVvHnzXO1Pnz4tu92uXr16uS7bxcbGKjY2tkbfn3/+ubZt26Zhw4Zp48aNrXI8AACYKSoq0uXLl3XL/ffL1rt3W5fjUeynTuntZ59VUVHR1RWUvL29tXHjRsXExCgqKqraI0zy8vK0bt06hYWFudrHx8crPT1dqampiouLa7O6AQBoKlvv3ur2jd9taBseEZQkacKECTpw4IASExO1bds2lZWVafjw4Vq7dm2tZ4oAAACay2OCkiRFREQoIyOj3nZpaWlKS0trUJ9hYWEyDKOZlQEAgI7oqrqPEgAAQGM0+oxSp06dmr1Ti8Wi8vLyZvcDAADgTo0OSlymAgAAV4smzVGyWCwKCwvTvHnzqn3bDAAAoCNpdFD63ve+p48//lifffaZfvvb32r8+PFasGCBpk+fLj8/P3fUCAAA0CYaPZn73//+tw4dOqRFixYpMDBQe/bs0bx589SrVy8tXrxYOTk57qgTAACg1TXpW28RERF69tlndfr0aW3atEnjx4+Xw+HQc889p8jISF133XVav369zpw509L1AgAAtJpm3R7Az89Pc+bM0e7du/Xpp5/q0UcfVf/+/fXxxx/r4YcfVt++fTVt2jT9/e9/V0VFRUvVDAAA0Cpa7D5KoaGhWrVqlT777DPXw2t9fHz0xhtv6Pbbb9eKFStaalcAAACtwi135p48ebIiIyM1atQoPfrooyorK+OMEgAA8DgtHpSys7P14osv6tVXX9Xly5dlGIa6deum66+/vqV3BQAA4FYtEpTy8/OVlpam9PR0ff755zIMQ506ddIPf/hDLViwQLfddpt8fHxaYlcAAACtpslByel0aseOHUpNTdXevXtlGIYMw9CgQYO0YMEC1y0DAAAAPFWjg9L//d//KTU1Vdu2bZPdbpdhGAoMDNRdd92lBQsW6Pvf/7476gQAAGh1jQ5KkZGRslgskqRx48ZpwYIFmjFjhjp37tzixQEAALSlJl9669+/vyQpNTVVqampjdrWYrFo9+7dTd01AABAq2hSUDIMQ3l5ecrPz5dhGI3evuqMFAAAQHvW6KA0f/58d9QBAADQ7jQ6KDX2MhsAAICnarFHmAAAAHQ0jQ5KAwYMUGRkpDtqAQAAaFcafektLy9PTqfTHbUAAAC0K1x6AwAAMEFQAgAAMEFQAgAAMEFQAgAAMNGkO3MXFxdr9erVzdrxypUrm7U9AACAuzUpKJWUlGjVqlXN2jFBCQAAtHdNfihuU57xBgAA4EmaFJS+853v6NSpUy1dCwAAQLvCZG4AAAATBCUAAAATBCUAAAATBCUAAAATbgtK69evb/a9lgAAANpSo7/1lpiYqICAgHrbPf744zpz5gz3SwIAAB6rSUEJAADgasAcJQAAABMEJQAAABMEJQAAABNuC0o8Cw4AAHi6Jj8Utz6HDx9WRUWFu7oHAABwO7cFpb59+7qrawAAgFbhlktveXl5ysnJUU5OjvLy8lqs35ycHE2dOlXBwcHy9/dXZGSktm/f3uDtMzIyNHPmTA0ZMkTBwcHq0qWLhgwZonvvvVcnTpxosToBAEDH0GJnlE6dOqWUlBRt27ZNX331VbV111xzjWbOnKlly5Y1+UzT3r17FRMTIz8/P82cOVOBgYHasWOHYmNjVVBQoKVLl9bbx5tvvqlDhw7p5ptv1g9/+EP5+Pjo6NGjSk9P15YtW/Tmm29q4sSJTaoPAAB0PC0SlLKyshQbGyuHw1HrJO6vvvpKzzzzjDZv3qyXX35Zt956a6P6Ly8v18KFC+Xl5aX9+/dr1KhRkqSVK1cqIiJCCQkJmjFjhkJDQ+vs5/HHH9fTTz9dY/nu3bs1efJkLVu2TDk5OY2qDQAAdFzNvvR2/Phx/eQnP5HdblfXrl2VkJCgt956S0ePHtXRo0f11ltv6ZFHHlG3bt3kcDh0xx136Pjx443ax549e3Ty5EnNnj3bFZIkyWazKSEhQaWlpUpPT6+3Hz8/v1qXT5o0SV27dtUnn3zSqLoAAEDH1uwzSr/97W915coVjRgxQrt27VL37t2rrR88eLAmTpyoX/ziF5o8ebI+/PBDrVmzRps3b27wPrKzsyVJ0dHRNdbFxMRIkvbt29fkY3jnnXd0/vx5/eAHP2hyHwAAoONpdlDavXu3LBaLNm7cWCMkfVNISIheeOEF3XzzzXrrrbcatY/c3FxJ0sCBA2us69mzpwICAlxtGiIrK0v/+Mc/5HQ6lZubqzfeeEMhISF68skn69zO6XTK6XS63jscjgbvEwAAeJ5mB6ULFy4oICBAo0ePrrftTTfdpICAAF24cKFR+7Db7ZK+vtRWm6CgIFebhsjKytITTzzhen/ttdfq5Zdf1o033ljndikpKVq1alWD9wMAADxbs+co9erVq1E3lqysrFSvXr2au9tmWbdunQzD0MWLF/Xuu+9q8ODBGjt2rLZu3VrndvHx8bLb7a5XQUFBK1UMAADaQrOD0tSpU3X58mXt2bOn3ra7d+/WpUuX9OMf/7hR+6g6k2R21sjhcJiebapLQECAIiIi9Nprr2nIkCFatGiRzp49a9rearUqKCio2gsAAHRczQ5Kjz76qHr06FHvTRtzc3O1cOFC9erVSytWrGjUPqrmJtU2D6mwsFDFxcW1zl9qKG9vb02YMEElJSU6fPhwk/sBAAAdS6PmKO3fv7/W5SkpKfrVr36lkSNH6s4779TEiRPVp08fSdKXX36pvXv36pVXXpGfn5+efPJJHTt2TD169GjwfseNG6eUlBRlZWVp5syZ1dZlZma62jTHqVOnJEk+Pj7N6gcAAHQcjQpK48ePl8ViqbPNli1btGXLllrXOZ1O3XPPPbJYLCovL2/wfidNmqTw8HBt3bpVDz30kOteSna7XcnJyfL19dW8efNc7U+fPi273a5evXpVuyR3+PDhWiedZ2Zm6m9/+5uCg4M1ZsyYBtcFAAA6tkZ/6622O2+7uw9vb29t3LhRMTExioqKqvYIk7y8PK1bt05hYWGu9vHx8UpPT1dqaqri4uJcy2+66SZdd911GjFihPr27auSkhL961//0ttvvy0fHx+9+OKL8vf3b/bxAQCAjqFRQamystJdddRrwoQJOnDggBITE7Vt2zaVlZVp+PDhWrt2rWJjYxvUR3Jysvbu3at9+/bp7Nmz8vLyUv/+/bVo0SL98pe/1NChQ918FAAAwJO02ENxW0NERIQyMjLqbZeWlqa0tLQay+Pj4xUfH++GygAAQEfU7G+9AQAAdFQEJQAAABONuvS2evXqFtvxypUrW6wvAAAAd2hUUEpKSqr39gD1MQxDFouFoAQAANq9RgWlqKgo06B05MgR1yNG+vTpo759+0r6+oaTX3zxhSQpODhYI0eObE69AAAAraZRQSk7O7vW5fHx8dq3b59mzZqlpKSkGo8T+eSTT7Rq1Spt2bJFY8aMUXJycpMLBgAAaC3Nvj3Ajh079Pvf/14PPPCANmzYUGuba6+9Vps3b5bNZtPatWs1evRo3XHHHc3dNQAAgFs1+1tvGzZskMViUVJSUr1tq9qYBSoAAID2pNlB6V//+pdsNptCQkLqbRsSEqLg4GB98MEHzd0tAACA2zU7KDmdTjkcDhUXF9fbtri4WA6HQ06ns7m7BQAAcLtmB6XBgwersrKyQZfTNmzYoIqKCg0ePLi5uwUAAHC7ZgeluLg4GYahFStWaNWqVbWeWbp06ZJWr16tFStWyGKxaMGCBc3dLQAAgNs1+1tvDz74oP73f/9XWVlZWr16tR5//HGNHj1affr0kfT1fZQOHz6sy5cvyzAMTZkyRQ888ECzCwcAAHC3ZgclLy8v/f3vf9fy5cu1YcMGXbp0Sfv373fdmNIwDElSp06d9OCDD2rt2rXy8uIRcwAAoP1rdlCSJF9fX61fv14PP/yw/vrXv+rw4cM6c+aMJKlHjx4aPXq0pk+frt69e7fE7gAAAFpFiwSlKr169dLPf/7zluwSAACgzbRoUJKkjz76qNYzSsOGDWvpXQEAALhViwWlN954QwkJCfroo49qXT9s2DCtWbNGt912W0vtEgAAwK1aZFb16tWrNW3aNP373/+WYRjq1KmTevTooR49eqhTp04yDEP//ve/dfvttzfoUScAAADtQbOD0s6dO5WUlCTDMBQVFaWsrCxdvHhRp0+f1unTp1VcXKysrCyNHz9ehmHot7/9rTIzM1uidgAAALdqdlBav369JOnOO+/U3r17NXnyZFmtVtd6X19fTZ48Wbt379add94pwzBc2wAAALRnzQ5Khw8flsVi0fr16133TqqNxWLRE088IUnKyclp7m4BAADcrtlBqbS0VMHBwa47cdelb9++6tq1q8rKypq7WwAAALdrdlAKDw9XcXGxSktL623rdDpVXFys8PDw5u4WAADA7ZodlGbPnq2ysjJt2rSp3rabN29WWVmZZs+e3dzdAgAAuF2zg9LSpUv1gx/8QA899JDS09NN223atEkPPfSQbrnlFi1durS5uwUAAHC7Zt9wMiUlRVFRUfrwww91zz33KDExUePHj3fNWfryyy+1b98+5efny2az6ZZbblFycnKtfa1cubK55QAAALSYZgelpKQk17fdDMNQfn6+Nm/eXK2NYRiSJLvdrpSUFNO+CEoAAKA9aXZQioqKqvO2AAAAAJ6q2UEpOzu7BcoAAABof1rkWW8AAAAdEUEJAADABEEJAADABEEJAADABEEJAADABEEJAADABEEJAADABEEJAADABEEJAADABEEJAADABEEJAADABEEJAADABEEJAADABEEJAADAhEcFpZycHE2dOlXBwcHy9/dXZGSktm/f3qBtDcNQRkaGFi9erBEjRshms6lLly4aOXKkkpOTdeXKFTdXDwAAPI13WxfQUHv37lVMTIz8/Pw0c+ZMBQYGaseOHYqNjVVBQYGWLl1a5/ZOp1NTp06V1WrV+PHjFRMToytXrigzM1OPPPKIXnvtNWVnZ6tLly6tdEQAAKC984igVF5eroULF8rLy0v79+/XqFGjJEkrV65URESEEhISNGPGDIWGhpr20alTJ61Zs0YPPPCAunbt6lpeVlam6dOn6/XXX9ef/vQnPfzww+4+HAAA4CE84tLbnj17dPLkSc2ePdsVkiTJZrMpISFBpaWlSk9Pr7MPHx8fPfLII9VCUtXy+Ph4SdK+fftavHYAAOC5POKMUnZ2tiQpOjq6xrqYmBhJzQs5Pj4+kiRv77o/DqfTKafT6XrvcDiavE8AAND+ecQZpdzcXEnSwIEDa6zr2bOnAgICXG2a4sUXX5RUexD7ppSUFNlsNterX79+Td4nAABo/zwiKNntdklfX2qrTVBQkKtNY2VkZOi5557T0KFDde+999bZNj4+Xna73fUqKCho0j4BAIBn8IhLb+6Sk5Oj2NhY2Ww2vfLKK7JarXW2t1qt9bYBAAAdh0ecUao6k2R21sjhcJiebTJz+PBhRUdHy8vLS5mZmRo2bFiz6wQAAB2LRwSlqrlJtc1DKiwsVHFxca3zl8wcPnxYU6ZMUWVlpTIzM3XTTTe1WK0AAKDj8IigNG7cOElSVlZWjXWZmZnV2tSnKiRVVFRo586duvnmm1uuUAAA0KF4RFCaNGmSwsPDtXXrVh05csS13G63Kzk5Wb6+vpo3b55r+enTp3Xs2LEal+ree+89TZkyReXl5crIyNCYMWNa6xAAAIAH8ojJ3N7e3tq4caNiYmIUFRVV7REmeXl5WrduncLCwlzt4+PjlZ6ertTUVMXFxUmSzp07pylTpujChQu69dZbtWvXLu3atavafoKDg/XLX/6y9Q4MAAC0ax4RlCRpwoQJOnDggBITE7Vt2zaVlZVp+PDhWrt2rWJjY+vd3uFw6Pz585KknTt3aufOnTXahIaGEpQAAICLxwQlSYqIiFBGRka97dLS0pSWllZtWVhYmAzDcFNlAACgI/KIOUoAAABtgaAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABgwqOCUk5OjqZOnarg4GD5+/srMjJS27dvb/D2J0+eVFJSkm677Tb16dNHFotFYWFh7isYAAB4NO+2LqCh9u7dq5iYGPn5+WnmzJkKDAzUjh07FBsbq4KCAi1durTePt5++22tWrVKnTp10tChQ1VYWNgKlQMAAE/lEWeUysvLtXDhQnl5eWn//v16/vnn9cQTT+iDDz7QoEGDlJCQoLy8vHr7iYqK0jvvvKOLFy/qww8/lI+PTytUDwAAPJVHBKU9e/bo5MmTmj17tkaNGuVabrPZlJCQoNLSUqWnp9fbT3h4uCIjI9W5c2c3VgsAADoKj7j0lp2dLUmKjo6usS4mJkaStG/fPrfX4XQ65XQ6Xe8dDofb9wkAANqOR5xRys3NlSQNHDiwxrqePXsqICDA1cadUlJSZLPZXK9+/fq5fZ8AAKDteERQstvtkr6+1FaboKAgVxt3io+Pl91ud70KCgrcvk8AANB2POLSW3thtVpltVrbugwAANBKPOKMUtWZJLOzRg6Hw/RsEwAAQFN5RFCqmptU2zykwsJCFRcX1zp/CQAAoDk8IiiNGzdOkpSVlVVjXWZmZrU2AAAALcUjgtKkSZMUHh6urVu36siRI67ldrtdycnJ8vX11bx581zLT58+rWPHjrXKBG8AANBxecRkbm9vb23cuFExMTGKioqq9giTvLw8rVu3rtoz2+Lj45Wenq7U1FTFxcW5lhcVFenXv/61631ZWZmKioqqtVm3bp1CQkJa4agAAEB75xFBSZImTJigAwcOKDExUdu2bVNZWZmGDx+utWvXKjY2tkF9FBcX17iDd0lJSbVlSUlJBCUAACDJg4KSJEVERCgjI6PedmlpaUpLS6uxPCwsTIZhuKEyAADQEXnEHCUAAIC2QFACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAwQVACAAAw4VFBKScnR1OnTlVwcLD8/f0VGRmp7du3N6oPp9Op1atXa+DAgfLz81Pv3r21aNEinTlzxk1VAwAAT+Xd1gU01N69exUTEyM/Pz/NnDlTgYGB2rFjh2JjY1VQUKClS5fW20dlZaWmTZumzMxMRUZGavr06crNzdXGjRu1e/duHTp0SN27d2+FowEAAJ7AI84olZeXa+HChfLy8tL+/fv1/PPP64knntAHH3ygQYMGKSEhQXl5efX2k56erszMTM2aNUv/+Mc/9Lvf/U47duzQM888o08//VQrVqxohaMBAACewiOC0p49e3Ty5EnNnj1bo0aNci232WxKSEhQaWmp0tPT6+3nhRdekCSlpKTIYrG4lv/0pz9VeHi4tmzZosuXL7d4/QAAwDN5RFDKzs6WJEVHR9dYFxMTI0nat29fnX1cuXJF7777rgYPHqzQ0NBq6ywWi6ZMmaKSkhIdPny4ZYoGAAAezyPmKOXm5kqSBg4cWGNdz549FRAQ4Gpj5uTJk6qsrKy1j2/2nZubq1tuuaXWNk6nU06n0/XebrdLkhwO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NXHiRD3zzDMqKSlp8Ro3bdqkIUOG6NKlS1qwYIECAwPVtWtX9evXT9u2bdOGDRsUEhIiSfLz86ux/f333y9JevrppxUQEKD+/fsrLCxMM2fObPFaAbQMghIAjxIUFKTXX39db775pmJjY9W/f385nU5dunRJffr0UXR0tFJSUnT8+PEW33fPnj2Vk5OjRx99VIMHD5aXl5e8vb01depU7dmzRwsXLnQ9+iQ4OLjG9gkJCXrqqac0evRo+fj46IsvvlBeXl6L3E4AgHtYDGYVAkCLyM3N1aBBgyRJ+fn56tevXxtXBKC5OKMEAC0kJSVFkvS9732PkAR0EAQlAGigY8eO6b777tP+/ft18eLFassXLFig1NRUSdLy5cvbqkQALYxLbwDQQEeOHNH111/vem+z2VRWVlbtUSkPPfSQnnrqqbYoD4AbEJQAoIEuXryo559/Xm+99ZaOHz+uM2fOqLy8XD169NCYMWO0aNEiTZo0qa3LBNCCCEoAAAAmmKMEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABggqAEAABg4v8DSfohWVhc1rIAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "dir_path = \"../generation-results/dplm_650m/novelty\"\n",
    "df_cat = load_tmscore(dir_path)\n",
    "df_cat[\"tm_scores\"] = df_cat[\"tm_scores\"].apply(lambda x: eval(x))\n",
    "df_cat[\"tm_scores_max\"] = df_cat[\"tm_scores\"].apply(lambda x: max(x))\n",
    "\n",
    "df = df_cat.groupby(\"length\").apply(lambda x: x[\"tm_scores_max\"].mean())\n",
    "df = df.reset_index()\n",
    "df.columns = [\"length\", \"pdb-TM\"]\n",
    "# plt.figure(figsize=(10, 6))\n",
    "sns.barplot(\n",
    "    x=\"length\", y=\"pdb-TM\", data=df, palette=\"Spectral\", edgecolor=\"black\"\n",
    ")\n",
    "plt.xlabel(\"Length\", fontdict={\"size\": 18})\n",
    "plt.ylabel(\"pdb-TM\", fontdict={\"size\": 18})\n",
    "plt.xticks(size=14)\n",
    "plt.yticks(size=14)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.19"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
